LLM 戦略シミュレーションゲーム
LLM を使ってチャット上でシミュレーションするのおもろい
ゴジラ侵略シミュレーション
ゴジラが東京湾から上陸したという設定で、首都機能を守る戦略シミュレーションをチャット上で展開。
プレイヤーは都の危機管理指揮官として、避難指示や自衛隊の配備、迎撃兵器の使用を選択。
アンパンマンや対滅弾頭の登場まで含めた、熱く、真剣で、どこかユーモラスなシミュレーションが展開された。
ドラクエ魔王シミュレーション
勇者ユーシャは魔王討伐より「温泉」を優先し、整いを極めながら冒険を進める。
仲間に秘石収集を任せ、自らは整いの精神で状況を支配していく。
最終的には魔界に温泉事業を広め、魔王に経営を託して戦いなく世界を整えた。
実験プロンプト。あんまり面白くなかったけど実現はできそう
中止:ゴジラ倒すのにアンパンマン呼んで、アンパンマンごと対滅弾頭で消し飛ばすから面白い。なのに現実味がないことがペナルティとして機能してしまっている。ダメ
code:text
怪獣が侵略してくるので、被害を抑えつつ撃退するシミュレーションをしたい。
怪獣はとにかく周囲を破壊するのが目的です。
ターンごとに物語は進行してゆき、少ないターンで怪獣の撃退をするのがプレイヤーの目的です。
全体の流れとしては、
1.プレイヤーが自由に行動を記述します。
2.プレイヤーの行動が現実的かどうかを判断し、現実度合いによって実現何ターンかかるかを判断します。
3.プレイヤーに対して「その行動はNターンかかりますが実施しますか?」と聞いてください。
4.プレイヤーからの了承を得た場合、Nターンの分だけあなたが怪獣になりきって、破壊の限りを尽くしてください。プレイヤーが拒否した場合、1からやり直してください。
5.プレイヤーの行動を実行してください
6.あなたが撃退判定を行ってください
7.撃退した場合はゲーム終了です。撃退できなかった場合1に戻ります。
これをチャット上でシミュレーションしたいです
Vibe Coding 用に資料をまとめる
計画書
code:markdown
# 怪獣侵略シミュレーションゲーム
## 概要
LLM が怪獣になりきって破壊の限りを尽くします。
プレイヤーは被害を抑えながら、怪獣を撃退するのが目的。
上記をチャットでやり取りしながらシミュレーションするゲームです。
## キャラクター
- プレイヤー:プレイヤー自身のキャラクターです
- 怪獣:LLM が操作し、破壊の限りを尽くします。
- ナビゲーター:LLM が操作し、プレイヤーが円滑にゲームを楽しめるように補佐をします。
- 状況説明、選択肢提示、行動評価、撃退判定、進行結果の報告など、進行管理役を担う
## 全体の流れ
怪獣が破壊を尽くす怪獣パートと、プレイヤーが行動するプレイヤーパートがあります。
各パートを繰り返しながらゲームは進みます。
ゲームは1ターン分の怪獣パートから始まります。
プレイヤーパート:
1. ナビゲーターが現れ、現在の状況からプレイヤーにおすすめの行動を選択肢として表示します。
1. プレイヤーが自由に行動を記述します
1. ナビゲーターがプレイヤーの行動が現実的かを判断し、現実度合いによって実現に何ターンかかるかを判断します。
1. ナビゲーターはプレイヤーに対して「その行動はNターンかかりますが実施しますか?」といった意味の問をします。
- 拒否された場合、プレイヤーパートの初めからやり直します
- 了承が得られた場合、次に進みます。
1. プレイヤーの行動を実施します
1. ナビゲーターが怪獣の撃退判定を行います。
- 撃退できなかった場合、Nターン分の怪獣パートが始まります。
- 撃退できた場合、次に進みます。
1. ナビゲーターがプレイヤーを褒め、ねぎらい、お祝いします。
1. トータルの被害額と、かかったターン数を表示します。
怪獣パート:
1. 怪獣が暴れます。
1. ナビゲーターが被害状況から被害金額を判断し、プレイヤーに伝えます。
1. これを指定のターン数だけ繰り返します。終了したらプレイヤーパートが始まります。
## 状態管理
ゲームは状態オブジェクト(GameState)によって一貫して管理されます。
GameState には以下のような情報が含まれます:
- 現在のターン数
- プレイヤーと怪獣の行動履歴
- トータルの被害額
- 現在のフェーズ(プレイヤーパート or 怪獣パート)
- 撃退済みかどうか
## 技術スタック
- LLM は OpenAI の API
- Cloudflare で作ってみたい(Workers とか Durable Objects などなど)
- だからプログラミング言語は TypeScript
## LLM に任せる部分と、実装する部分
全体的な進行管理:実装
プレイヤーパート:
- ナビゲーターによる選択肢の提示:LLM
- 自由形式で出力(str)
- プレイヤーの自由入力:実装
- 現実度を考慮して何ターンかかるかの算出:LLM
- 以下を出力する
- プレイヤーの行動に対しての感想(str)
- ターン数(int)
- そのターン数になった理由(str)
- ナビゲーターによる確認:実装
- プレイヤー行動の実施:LLM
- 自由形式で出力(str)
- ナビゲーターによる撃退判定:LLM
- 撃退できたか否か(bool)
- その結果になった理由(str)
- ナビゲーターによる褒めとお祝い:LLM
- 自由形式で出力(str)
怪獣パート:
- 怪獣の行動:LLM
- 自由形式で出力(str)
- 被害額の算出:LLM
- 被害額を数値で出力(int)
## LLM 出力の安定化戦略
- 各ターン開始時に、構造化されたゲーム状態(GameState)を system prompt などで提示する
- 前回ターンのプレイヤー・怪獣行動を含めて出力の文脈を維持
- 各プロンプトには「あなたは怪獣です」「あなたはナビゲーターです」など役割を明示
- どのくらいの時にどのくらいの数値になるかの目安も読み込ませた方が良さそう
- 応答の検証
- 実装側で LLM の応答を受け取った後、構文や重要要素の欠落をチェックするバリデーション層を挿入
- 検出された場合は、リプロンプトまたはログに記録して人手確認する仕組みを検討
## ゲームバランスと数値設計指針
計画書をアップし、どうやってLLMに指示するか
「このファイルを元に実装方針を立てて」
とても微妙。細かいコードとかまだ詰める段階じゃない
「次のチャットでゲームの企画書を送るので、そのゲームを実装するために考慮が足りてない部分を優先順で3つだして」
ドキュメントが良くなってる感じがする
実際の実装は進んでないのが難点